package com.cskaoyan.javase.basic._5extra;

/**
 * 基本数据类型的类型转换机制,Java是强类型语言,变量的类型不会轻易被改变,但也可以改变
 * 这就是java中类型转换的机制
 *
 * Java中变量(常量)的数据类型由某一种转换为另一种，我们将这个过程叫做数据类型转换。
 * 我们之前提到过：声明是告诉编译器变量的数据类型，那么数据类型的转换，也同样是要告诉编译器怎么转换，转换成了什么数据类型。
 *
 * 数据类型转换的分类:
 *      1.自动类型转换,程序员无需做额外操作,而编译器自动完成的类型转换.
 *          这时只要符合一定的转换场景,就能够自动完成类型转换,程序员无需写额外代码.
 *      2.强制类型转换,程序员需要写特殊代码告诉编译器进行类型转换
 *          强制类型转换需要写额外的代码,需要固定的语法格式
 *
 * 基本数据类型的类型转换发生在数值类型之间,也就是不包括boolean,布尔类型不参与任何类型转换. 具体来说就是byte,short,int,long,float,double,char它们之间进行类型转换
 *
 * 基本数据类型的自动类型转换
 *      1.怎么样算自动类型转换,触发的场景是什么?
 *          将取值范围小的数据类型转换(赋值)给取值范围大的数据类型时,是自动类型转换
 *          "小"-->"大"是自动类型转换
 *          相当于将杯子里的水往河里倒,河当然能装得下杯子里的水,所以自动完成
 *
 *      2.既然是自动转换,自动完成,那么这个转换就是绝对安全的吗?不会出现数据失真吗?
 *          不是绝对安全,考虑浮点数的精度问题
 *
 * 基本数据类型的强制类型转换
 *      1.怎么样算强制类型转换,触发的场景是什么?
 *         将取值范围大的数据类型转换(赋值)给取值范围小的数据类型时,是强制类型转换
 *          "大"-->"小"是强制类型转换
 *         相当于将河里的水往杯子里倒,大概率来说杯子是装不下的,装不下就会溢出,溢出就会导致数据失真,所以强制类型转换有不小的概率会导致数据失真
 *         但是当河水已经干涸到杯子都装得下了,这时就不会失真
 *         总之,强转是很危险的,容易导致数据失真,所以强转必须程序员手动完成
 *
 *      2.强转的特殊语法:
 *          强转后的数据类型 变量名 = (强转后的数据类型)被强转的变量或者常量;
 *
 * 扩展:
 *      既然基本数据类型能够类型转换,那么引用数据类型也一样可以类型转换
 *      引用数据类型的类型转换同样分两类,自动转换和强制转换(挖了一个大坑)
 *
 *
 * @since 11:16
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // int --> long 属于小到大,是自动类型转换
        long a = 100;
        char b = 'a';
        // short --> char 不行
        // short c = b;
        // short --> int 是可以的
        int c = b;

        // long --> float是自动类型转换
        float d = a;

        int num = 2111234567;
        float num2 = num;
        // 数据失真
        System.out.println(num2);

        // double --> float 大到下,是强转,强转要想完成,需要程序员写特殊的语法,不可以自动完成
        // double到float已经数据失真了
        float num3 = (float) 0.1;

        // double --> int 是强转
        int num4 = (int) 100.9;
        // 强转在开发中经常被用于小数取整
        System.out.println(num4);

        /*
            几个比较重要的IDEA快捷键
                1.在写带有"="的赋值语句时,成熟的Java程序员普遍会选择从右往左写,因为右边写完,左边可以自动补全
                a.使用快捷键ctrl + alt + V
                b.在右边的表达式或者数值后面写".var"

                2.强转的快捷键:
                    .cast
         */
        int sum = 10 + 20;
        int sum2 = 10 * 20;
        int num5 = (int) 100.1;

        double sum3 = 100 + 0.1;

        String str = 100 + 200 + "abc";

        int num6 = (int) 100.1;
    }
}
